const express = require('express');
const router = express.Router();
const passport = require('../config/passport');
const { loginValidator, registerValidator, validateAndHandle, register } = require('../controller/user');
const multer = require('../config/multer');
const debug = require('debug')('express-auth-3:server');
const upload = multer({ dest: 'uploads/' });


/* ----------------------------------- 渲染视图 ----------------------------------- */

router.get('/', function (req, res, next) {
  res.send('respond with a resource', {
    title: 'Users',
  });
});

router.get('/login', function (req, res, next) {
  res.render('login', {
    title: 'Login',
    message: req.flash('error'),
  });
});

router.get('/register', function (req, res, next) {
  res.render('register', {
    title: 'Register',
    info: req.flash('info')
  });
});



/* ----------------------------------- 接口请求 ----------------------------------- */
// 🚀 简化方案：使用高阶函数替代内联校验处理
router.post('/login',
  ...validateAndHandle(loginValidator, 'login'),
  passport.authenticate('local', {
    failureRedirect: '/users/login',
    successRedirect: '/',
    failureMessage: false, // true 表示将失败消息存储在 req.session.messages 中
    failureFlash: true,  // 启用flash错误消息, 默认是 error ，也可以指定键名
  }),
  function (req, res, next) {
    // 登录后的必要操作，login可以添加一些逻辑 login(req.user);
    req.session.regenerate(function (err) {
      req.session.save((err) => {
        if (err) {
          return next(err);
        }
        res.redirect('/');
      });
    });
  }
);

router.get('/logout', function (req, res, next) {
  // 调用 passport 登出
  req.logout(function (err) {
    if (err) { return next(err); }

    req.session.regenerate(function (err) {
      if (err) { return next(err); }
      res.redirect('/');
    });
  });
})

// 🚀 简化方案：使用高阶函数 validateAndHandle
// 原写法：registerValidator(), handleValidationErrors
// 简化为：...validateAndHandle(registerValidator, 'register')
router.post('/register',
  ...validateAndHandle(registerValidator, 'register'),
  upload.single('profileimage'),
  (req, res, next) => {
    debug('文件信息', req.file); // 文件信息

    const { username, password, email, profileimage, name } = req.body;

    register({ username, password, email, profileimage, name }, (err, userid) => {
      if (err) {
        return next(err);
      }

      const user = {
        id: userid,
        username,
      };

      // 调用 passport 登录
      req.login(user, function (err) {
        if (err) { return next(err); }
        req.session.save((err) => {
          if (err) return next(err);
          res.redirect('/'); // 登录后跳转主页
        });
      });
    });
  });

router.post('/upload', upload.single('profileimage'), (req, res, next) => {
  debug('文件信息', req.file); // 文件信息

  // 检查文件是否上传成功
  if (!req.file) {
    req.flash("info", "请选择要上传的文件");
    return res.redirect('/users/register');
  }

  // 设置成功消息
  req.flash("info", "上传成功");

  // 重定向到注册页面（触发 GET 请求，flash 消息会在那里显示）
  res.redirect('/users/register');
});

module.exports = router;
